/*
'+' 的隐式类型转换规则

'+' 号操作符，不仅可以用作数字相加，还可以用作字符串拼接。仅当 '+' 号两边都是数字时，进行的是加法运算；如果两边都是字符串，则直接拼接，无须进行隐式类型转换。

除了上述比较常规的情况外，还有一些特殊的规则，如下所示。

如果其中有一个是字符串，另外一个是 undefined、null 或布尔型，则调用 toString() 方法进行字符串拼接；如果是纯对象、数组、正则等，则默认调用对象的转换方法会存在优先级（下一讲会专门介绍），然后再进行拼接。

如果其中有一个是数字，另外一个是 undefined、null、布尔型或数字，则会将其转换成数字进行加法运算，对象的情况还是参考上一条规则。

如果其中一个是字符串、一个是数字，则按照字符串规则进行拼接。
 */

console.log(1 + 2)
console.log('1' + '2')
console.log('1' + undefined)     // "1undefined" 规则1，undefined转换字符串
console.log('1' + null)          // "1null" 规则1，null转换字符串
console.log('1' + true)          // "1true" 规则1，true转换字符串
console.log('1' + 1n)          // '11' 比较特殊字符串和BigInt相加，BigInt转换为字符串
console.log(1 + undefined)     // NaN  规则2，undefined转换数字相加NaN
console.log(1 + null)          // 1    规则2，null转换为0
console.log(1 + true)          // 2    规则2，true转换为1，二者相加为2
//console.log(1 + 1n)            // 错误  不能把BigInt和Number类型直接混合相加
console.log('1' + 3)           // '13' 规则3，字符串拼接
console.log(1 + '3')           // '13' 规则3，字符串拼接

